package viewModel;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import modelo.entidad.Inmueble;
import modelo.entidad.Inmueble_Filtro;
import modelo.hibernate.dao.DaoInmueble;

import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.NotifyChange;

public class GestionInmuebleViewModel {

	private static final String inMessage = "Total %d Inmuebles";

	private Inmueble_Filtro inmuebleFilter = new Inmueble_Filtro();

	private DaoInmueble daoIn = new DaoInmueble();

	List<Inmueble> todosInmuebles;

	private static final long serialVersionUID = 1L;
	private boolean displayEdit = true;

	public boolean isDisplayEdit() {
		return displayEdit;
	}

	public GestionInmuebleViewModel() {
		super();
		try {
			todosInmuebles = daoIn.obtenerTodos();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public List<Inmueble> getObtenerInmuebles() {
		return todosInmuebles;
	}

	public Inmueble_Filtro geInmuebleFilter() {
		return inmuebleFilter;
	}

	public String getFooter() {
		return String.format(inMessage, todosInmuebles.size());
	}

	@Command
	@NotifyChange({ "obtenerInmuebles", "footer" })
	public void changeFilter() {
		todosInmuebles = getFilterInmueble(inmuebleFilter);
	}

	@NotifyChange({ "obtenerInmebles", "displayEdit" })
	public void setDisplayEdit(boolean displayEdit) {
		this.displayEdit = displayEdit;
	}

	@Command
	public void changeEditableStatus(@BindingParam("inmueble") Inmueble inmueble) {
		inmueble.setEditingStatus(!inmueble.getEditingStatus());
		refreshRowTemplate(inmueble);
	}

	@Command
	public void confirm(@BindingParam("inmueble") Inmueble in) {
		changeEditableStatus(in);
		try {
			daoIn.actualizarInmueble(in);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		refreshRowTemplate(in);
	}

	public void refreshRowTemplate(Inmueble in) {
		/*
		 * This code is special and notifies ZK that the bean's value has
		 * changed as it is used in the template mechanism. This stops the
		 * entire Grid's data from being refreshed
		 */
		BindUtils.postNotifyChange(null, null, in, "editingStatus");
	}

	@Command
	@NotifyChange({ "obtenerInmuebles", "footer" })
	public void eliminarRegistro(@BindingParam("inmueble") Inmueble in) {
		try {
			todosInmuebles.remove(in);
			daoIn.eliminarInmueble(in);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public List<Inmueble> getFilterInmueble(Inmueble_Filtro inmuebleFilter) {

		List<Inmueble> someIn = new ArrayList<Inmueble>();
		String dir = inmuebleFilter.getDireccion();
		String tipin = inmuebleFilter.getTipoInmueble();
		String top = inmuebleFilter.getTipooperacion();

		List<Inmueble> inAll = null;
		try {
			inAll = daoIn.obtenerTodos();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		for (Iterator<Inmueble> i = inAll.iterator(); i.hasNext();) {
			Inmueble tmp = i.next();
			if (tmp.getDireccion().toLowerCase().contains(dir)
					&& tmp.getTipoInmueble().toLowerCase().contains(tipin)
					&& tmp.getTipooperacion().toLowerCase().contains(top)) {
				someIn.add(tmp);
			}
		}
		return someIn;
	}
	
	


}
